// logger.ts
export function logError(message: string, error?: unknown) {
  const stackLine = getCallerStackLine();
  if (!stackLine) {
    console.error(message, error || "");
    return;
  }

  const fileInfo = extractFileInfo(stackLine);
  console.info(
    fileInfo ? `${fileInfo.fullPath}:${fileInfo.line} ${message}` : message,
    error || ""
  );
}

function getCallerStackLine(): string | null {
  try {
    const stack = new Error().stack?.split("\n") || [];
    // 跳过当前错误行和 logError 调用行，定位到实际调用位置
    return stack[3]?.trim() || null;
  } catch {
    return null;
  }
}

function extractFileInfo(stackLine: string): { fullPath: string; line: string } | null {
  // 匹配格式：/path/to/file.(vue|ts|js):行号:列号，支持查询参数
  // console.log("extractFileInfo stackLine", stackLine);
  /**
   * \/ - 匹配斜杠 /
   * [^:]+ - 匹配一个或多个非冒号字符（文件路径部分）
   * \. - 匹配点号 .
   * (vue|ts|js|tsx|jsx) - 匹配文件扩展名（vue、ts、js、tsx、jsx 中的任意一个）
   * (?:...) - 非捕获组，不占用捕获组编号
   * \? - 匹配问号 ?
      [^:]* - 匹配零个或多个非冒号字符（查询参数内容）
      ? - 整个查询参数部分是可选的
   * : - 匹配冒号
      (\d+) - 第一个捕获组：匹配一个或多个数字（行号）
      : - 匹配冒号
      (\d+) - 第二个捕获组：匹配一个或多个数字（列号）
   */
  const match = stackLine.match(/\/([^:]+\.(vue|ts|js|tsx|jsx))(?:\?[^:]*)?:(\d+):(\d+)/);
  // console.log("extractFileInfo match", match);
  if (match) {
    const fullPath = match[1]; // 第一捕获组：/src/views/.../file.vue
    // console.log("extractFileInfo fullPath", fullPath);
    return {
      fullPath: fullPath || "", // 提取文件名
      line: match[3], // 第二捕获组：行号
    };
  }
  return null;
}
